package com.yds.modewithprinceple.singleton;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.yds.modewithprinceple.R;
import com.yds.modewithprinceple.databinding.ActivitySingletonModeBinding;
import com.yds.modewithprinceple.singleton.SingletonDCL;
import com.yds.modewithprinceple.singleton.SingletonEnum;
import com.yds.modewithprinceple.singleton.SingletonInternalClass;
import com.yds.modewithprinceple.singleton.SingletonSlacker;
import com.yds.modewithprinceple.singleton.SingletonStarving;

/**
 * 单例模式
 *
 * 单例模式是运用最广泛的设计模式之一，在应用这个模式时，单例模式的类必须保证只有一个实例存在。
 * 多用于整个程序只需要有一个实例，通常很消耗资源的类，比如线程池，缓存，网络请求，IO操作，访问数据库等。
 * 由于类比较耗资源，所以没必要让它构造多个实例，这种就是单例模式比较好的使用场景。
 * <p>
 * 单例模式定义
 * 确保某一个类只有一个实例，并且自行实例化，向整个系统提供这个唯一实例。
 */
@SuppressWarnings("all")
public class SingletonPatternActivity extends AppCompatActivity implements View.OnClickListener {
    private ActivitySingletonModeBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivitySingletonModeBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.btStarving.setOnClickListener(this);
        binding.btSlacker.setOnClickListener(this);
        binding.btDCL.setOnClickListener(this);
        binding.btInternalClass.setOnClickListener(this);
        binding.btEnum.setOnClickListener(this);

        binding.tvSingletonIntroduce.setText("/**\n" +
                " * 单例模式\n" +
                " *\n" +
                " * 单例模式是运用最广泛的设计模式之一，在应用这个模式时，单例模式的类必须保证只有一个实例存在。\n" +
                " * 多用于整个程序只需要有一个实例，通常很消耗资源的类，比如线程池，缓存，网络请求，IO操作，访问数据库等。\n" +
                " * 由于类比较耗资源，所以没必要让它构造多个实例，这种就是单例模式比较好的使用场景。\n" +
                " * <p>\n" +
                " * 单例模式定义\n" +
                " * 确保某一个类只有一个实例，并且自行实例化，向整个系统提供这个唯一实例。\n" +
                " */");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btStarving://饿汉式
                SingletonStarving singletonStarving = SingletonStarving.getInstance();
                Log.i("Simon","饿汉式 = "+singletonStarving.hashCode());
                break;
            case R.id.btSlacker://懒汉式
                SingletonSlacker singletonSlacker = SingletonSlacker.getInstance();
                Log.i("Simon","懒汉式 = "+singletonSlacker.hashCode());
                break;
            case R.id.btDCL://DCL
                SingletonDCL singletonDCL = SingletonDCL.getInstance();
                Log.i("Simon","DCL = "+singletonDCL.hashCode());
                break;
            case R.id.btInternalClass://静态内部类
                SingletonInternalClass singletonInternalClass = SingletonInternalClass.getInstance();
                Log.i("Simon","静态内部类 = "+singletonInternalClass.hashCode());
                break;
            case R.id.btEnum://枚举
                SingletonEnum singletonEnum = SingletonEnum.INSTANCE;
                Log.i("Simon","静态内部类 = "+singletonEnum.hashCode());
                break;
        }
    }
}